package com.ruoyi.hire.controller.common;


import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.redis.RedisCache;
import com.ruoyi.common.utils.uuid.IdUtils;
import com.ruoyi.hire.domain.vo.GeetestResult;
import com.ruoyi.hire.domain.vo.GeetestValidateVo;
import com.ruoyi.hire.task.CheckGeetestStatusTask;
import com.ruoyi.hire.utils.geetest.GeetestLib;
import com.ruoyi.hire.utils.geetest.sdk.entity.GeetestLibResult;
import com.ruoyi.hire.utils.geetest.sdk.enums.DigestmodEnum;
import com.ruoyi.system.service.ISysConfigService;
import lombok.AllArgsConstructor;
import lombok.Data;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;

import static com.ruoyi.common.core.domain.AjaxResult.error;
import static com.ruoyi.common.core.domain.AjaxResult.success;

@RestController
@RequestMapping("/site/geetest")
public class GeetestController {
    @Resource
    private ISysConfigService configService;

    @Resource
    private RedisCache redisCache;


    @GetMapping("/register")
    public AjaxResult register() {
        String id = configService.selectConfigByKey("geetest.id");
        String key = configService.selectConfigByKey("geetest.key");
        /*
        必传参数
            digestmod 此版本sdk可支持md5、sha256、hmac-sha256，md5之外的算法需特殊配置的账号，联系极验客服
        自定义参数,可选择添加
            user_id 客户端用户的唯一标识，确定用户的唯一性；作用于提供进阶数据分析服务，可在register和validate接口传入，不传入也不影响验证服务的使用；若担心用户信息风险，可作预处理(如哈希处理)再提供到极验
            client_type 客户端类型，web：电脑上的浏览器；h5：手机上的浏览器，包括移动应用内完全内置的web_view；native：通过原生sdk植入app应用的方式；unknown：未知
            ip_address 客户端请求sdk服务器的ip地址
        */
        GeetestLib gtLib = new GeetestLib(id, key);
        String userId = "test";
        GeetestLibResult result = null;
        // 检测存入redis中的极验云状态标识
        if (CheckGeetestStatusTask.checkGeetestStatusRedisFlag()) {
            DigestmodEnum digestmodEnum = DigestmodEnum.MD5;
            Map<String, String> paramMap = new HashMap<String, String>();
            paramMap.put("digestmod", digestmodEnum.getName());
            paramMap.put("user_id", userId);
            paramMap.put("client_type", "web");
            result = gtLib.register(digestmodEnum, paramMap);
        } else {
            result = gtLib.localInit();
        }
        // 注意，不要更改返回的结构和值类型
        return success(result.getData());
    }

    /**
     * 极验证二次验证
     *
     * @param req
     * @return
     */
    @PostMapping("/validate")
    public AjaxResult validate(@RequestBody GeetestValidateVo req) {
        String id = configService.selectConfigByKey("geetest.id");
        String key = configService.selectConfigByKey("geetest.key");
        GeetestLib gtLib = new GeetestLib(id, key);
        String challenge = req.getGeetest_challenge();
        String validate = req.getGeetest_validate();
        String seccode = req.getGeetest_seccode();
        GeetestLibResult result = null;
        // 检测存入redis中的极验云状态标识
        if (CheckGeetestStatusTask.checkGeetestStatusRedisFlag()) {
            result = gtLib.successValidate(challenge, validate, seccode, null);
        } else {
            result = gtLib.failValidate(challenge, validate, seccode);
        }
        if (result.getStatus() == 1) {
//            log.info("极验证二次验证");
            String uuid = IdUtils.simpleUUID();
            redisCache.setCacheObject(uuid, uuid, 5, TimeUnit.MINUTES);
            return success(new GeetestResult("success", GeetestLib.VERSION, uuid));
        } else {
            //发生错误
            return error(result.getMsg(), new GeetestResult("fail", GeetestLib.VERSION, result.getMsg()));
        }
    }
}
